#ifndef CORE_PVN_H_
#define CORE_PVN_H_

#include "../GameLogic/MainLoop.h"
#include "./ThreadManagement/ThreadLauncher.h"
#include "../Input/InputThread.h"

namespace Core {

/**
 * Glowna klasa gry. Odpowiada za inicjalizacje i zamkniecie gry, a takze przechowuje i przygotowuje
 * obiekt glownej petli gry.
 */
class PvN {

	Graphics::Presentation& presentation_;
	GameLogic::Simulation* simulation_;
	Input::InputThread* input_;
	ThreadManagement::ThreadLauncher input_thread_;

	/** Inicjalizuje grafike. */
	bool initOgre();

	/** Inicjalizuje wejscie. Musi byc wolane po zainicjalizowaniu grafiki. */
	bool initOIS();

	/** Tworzy, przygotowuje do rozpoczecia rozgrywki, a nastepnie zwraca obiekt MainLoop. */
	GameLogic::MainLoop* setupGame( bool is_server /* TODO: Settings s */);

	PvN();

	~PvN();

public:

	static PvN& getInstance() {
		static PvN instance;
		return instance;
	}

	GameLogic::Simulation* getSimulation() {
		return simulation_;
	}

	/** Inicjalizuje grafike i wejscie, tudziez ogolnie przygotowuje gre do dzialania. */
	bool init();

	/** Rozpoczyna rozgrywke. Wczytuje plansze, etc. */
	void beginGame( bool is_server /* TODO: Settings s */);

}; //class PvN

} //namespace Core

#endif /* CORE_PVN_H_ */
